<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // var a;
        // var fn1
        // function fn2() { }
        /*
            预解析 --变量的声明提升
               一个脚本内 
                    1-我们使用var定义的变量，会在代码执行以前 会被偷偷 把声明部分提升到 当前脚本的最前面
                    2-声明式函数也会被提升，整个提升到 脚本的最前面
                浏览器中有一个js引擎，他负责执行网页中js带代码， 会被偷偷 把声明部分提升到 当前脚本的最前面
                    3-函数内部也有声明提升
                    函数内部使用var定义的变量 声明部分会被提升到 当前函数的最前面

        */
        //   *** 因为有声明提升，所有在js中有个奇特的现象，一个使用var定义的变量，可以在定义之前使用
        //   *** 这个现在没有意义，反而会出现NaN 或者undefined 的值
        console.log(a); //
        console.log(a + 1);
        // js重复声明变量 不会报错
        var a = 1;
        // b = 1 不是用var 声明变量也可以， 但是不建议


        function box() {
            // var b;
            console.log(b);//undefined
            var b = 1;
        }
        box();


        console.log(fn1);
        // fn1()//fn1是undefined ，不是一个函数，不能被加小括号调用， fn1 is not a function
        var fn1 = function () { }
        fn2()
        function fn2() {
            console.log('fn2');
        }



    </script>

</body>

</html>